<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // promise是ES6提出的一种异步编程解决方案
        // 开发过程中经常有一种问题，就是我这一次网络请求的结果是我下一次网络请求的参数，如此循环个几轮，代码就会十分难以维护。也就是大家熟知的回调地狱。

        // promise一共有三种状态，fulfilled(已成功)、pending(进行中)、rejected(已失败)
        // 特点：状态是不受外界影响的，只由异步操作的结果决定，一旦状态改变就不会再有第二次改变
        // 也就是说，要么从pending --> fulfilled，要么从pending --> rejected

        // 用法: promise是一个构造函数, 用来生成promise实例
        // 接受一个回调函数函数作为参数，回调函数中还有两个参数
        const p = new Promise((resolve, reject) => {
            // resolve函数：将promise对象的状态从pending变为fulfilled
            resolve();//resolve接受一个参数，用来返回异步操作的结果

            // reject函数：将promise对象的状态从pending变为rejected
            reject();//reject接受一个参数，用来返回异步操作的结果
        });


        const p2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                if (new Date().getTime() % 2 == 0) {
                    resolve('success')
                }
                else {
                    reject('failed')
                }
            }, 1000);
        })

        // promise实例的方法
        // then(): 当实例状态发生改变的时候触发
        p2.then(res => {//变为fulfilled的时候执行这个回调函数
            console.log(res);
        },
            reason => {//变为rejected的时候执行这个回调函数
                console.log(reason);
            })

        // catch(): 用于指定发生错误的回调函数, 一般来说通过catch代替then中的第二个回调函数
        p2.catch(err => {
            console.log(err);
        });

        // finally(): 用来指定不管promise对象状态最后如何，都会执行的操作
        p2.finally(()=>{
            console.log('执行结束');
        })
    </script>
</body>

</html>